const SIGN_REGEXP = /([yMdhsm])(\1*)/g;
const DEFAULT_PATTERN = 'yyyy-MM-dd';
export default {
    getQueryStringByName: function (name) {
        var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
        var r = window.location.search.substr(1).match(reg);
        var context = "";
        if (r != null)
            context = r[2];
        reg = null;
        r = null;
        return context == null || context == "" || context == "undefined" ? "" : context;
    },
    formatDate: {
        format: function (date, fmt) {
            var o = {
                "M+": date.getMonth() + 1, //月份
                "d+": date.getDate(), //日
                "h+": date.getHours(), //小时
                "m+": date.getMinutes(), //分
                "s+": date.getSeconds(), //秒
                "q+": Math.floor((date.getMonth() + 3) / 3), //季度
                "S": date.getMilliseconds() //毫秒
            };
            if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
            for (var k in o)
                if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
            return fmt;
        },
        parse: function (dateString, pattern) {
            var matchs1 = pattern.match(SIGN_REGEXP);
            var matchs2 = dateString.match(/(\d)+/g);
            if (matchs1.length == matchs2.length) {
                var _date = new Date(1970, 0, 1);
                for (var i = 0; i < matchs1.length; i++) {
                    var _int = parseInt(matchs2[i]);
                    var sign = matchs1[i];
                    switch (sign.charAt(0)) {
                        case 'y':
                            _date.setFullYear(_int);
                            break;
                        case 'M':
                            _date.setMonth(_int - 1);
                            break;
                        case 'd':
                            _date.setDate(_int);
                            break;
                        case 'h':
                            _date.setHours(_int);
                            break;
                        case 'm':
                            _date.setMinutes(_int);
                            break;
                        case 's':
                            _date.setSeconds(_int);
                            break;
                    }
                }
                return _date;
            }
            return null;
        }
    },
    cookie: {
        getCookie: function (name) {
            var regexp = new RegExp("(?:^" + name + "|;\\s*" + name + ")=(.*?)(?:;|$)", "g");
            var result = regexp.exec(document.cookie);
            return (result === null) ? null : decodeURIComponent(result[1]);
        },
        setCookie: function (name, value, expires, path, domain) {
            var cookie = name + '=' + escape(value) + ';';
            if (expires) {
                if (expires instanceof Date) {
                    cookie += 'expires=' + expires.toGMTString() + ';';
                }
            }
            path = path ? path : '/';
            cookie += 'path=' + path + ';';
            if (domain) {
                cookie += 'domain=' + domain + ';';
            }
            document.cookie = cookie;
        },
        delCookie: function (name, path, domain, secure) {
            if (this.getCookie(name)) {
                var expires = new Date();
                expires.setTime(expires.getTime() + -10 * 1000);
                domain = domain ? domain : '';
                path = path ? path : '/';
                var newCookie = escape(name) + '=' + escape('') + (expires ? '; expires=' + expires.toGMTString() : '') + '; path=' + path + (domain ? '; domain=' + domain : '') + (secure ? '; secure' : '');
                document.cookie = newCookie;
            }
        }
    },
    xlsx: {
        getGridDataToJson: function () {
            var headData = document.querySelectorAll(".el-table__header-wrapper table thead tr th .cell");
            var contentData = document.querySelectorAll(".el-table__body-wrapper table tbody tr");

            var AllJsonData = [];
            var header = {};
            for (var i = 0, j = headData.length; i < j; i++) {
                var parse = headData[i].textContent;
                header[parse] = parse;
            }
            AllJsonData.push(header);
            for (var i = 0, j = contentData.length; i < j; i++) {
                var cellData = contentData[i].querySelectorAll(".cell");
                var cellObj = {};
                for (var m = 0, n = cellData.length; m < n; m++) {
                    var parse = headData[m].textContent;
                    cellObj[parse] = cellData[m].textContent;
                }
                AllJsonData.push(cellObj);
            }
            return AllJsonData;
        },
        downloadExl: function (json, XLSX, name) {
            document.querySelector("body").insertAdjacentHTML("beforeend", '<a href="" download="' + name + '.xlsx" id="hf"></a>');

            var type = "xlsx";
            var tmpDown; //导出的二进制对象
            var keyMap = []; //获取键
            for (var k in json[0]) {
                keyMap.push(k);
            }
            var tmpdata = []; //用来保存转换好的json
            json.map((v, i) => keyMap.map((k, j) => Object.assign({}, {
                v: v[k],
                position: (j > 25 ? this.getCharCol(j) : String.fromCharCode(65 + j)) + (i + 1)
            }))).reduce((prev, next) => prev.concat(next)).forEach((v, i) => tmpdata[v.position] = {
                v: v.v
            });
            var outputPos = Object.keys(tmpdata); //设置区域,比如表格从A1到D10
            var tmpWB = {
                SheetNames: ['mySheet'], //保存的表标题
                Sheets: {
                    'mySheet': Object.assign({},
                        tmpdata, //内容
                        {
                            '!ref': outputPos[0] + ':' + outputPos[outputPos.length - 1] //设置填充区域
                        })
                }
            };
            tmpDown = new Blob([this.s2ab(XLSX.write(tmpWB, {
                    bookType: (type == undefined ? 'xlsx' : type),
                    bookSST: false,
                    type: 'binary'
                } //这里的数据是用来定义导出的格式类型
            ))], {
                type: ""
            }); //创建二进制对象写入转换好的字节流
            var href = URL.createObjectURL(tmpDown); //创建对象超链接
            document.getElementById("hf").href = href; //绑定a标签
            document.getElementById("hf").click(); //模拟点击实现下载
            setTimeout(function () { //延时释放
                URL.revokeObjectURL(tmpDown); //用URL.revokeObjectURL()来释放这个object URL
            }, 100);
        },
        s2ab: function (s) { //字符串转字符流
            var buf = new ArrayBuffer(s.length);
            var view = new Uint8Array(buf);
            for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
            return buf;
        },
        // 将指定的自然数转换为26进制表示。映射关系：[0-25] -> [A-Z]。
        getCharCol: function (n) {
            let temCol = '',
                s = '',
                m = 0
            while (n > 0) {
                m = n % 26 + 1
                s = String.fromCharCode(m + 64) + s
                n = (n - m) / 26
            }
            return s
        }
    },
    extend: function (target, source, flag) {

        for (var key in source) {
            if (source.hasOwnProperty(key))
                flag ?
                (target[key] = source[key]) :
                (target[key] === void 0 && (target[key] = source[key]));
        }
        return target;
    },
    mergeArrays: function (keys, arrs, link) {
        let obj = {};
        let ret = [];
        keys.forEach(o => {
            obj[o.key] = null;
        })
        let mainArray = arrs[0];
        mainArray.forEach(item => {
            let v = item[link];
            item.lined = false;
            if (v !== undefined) {
                for (let index = 1; index < arrs.length; index++) {
                    const eleArray = arrs[index];
                    for (let j = 0; j < eleArray.length; j++) {
                        const a = eleArray[j];
                        if (a[link] === v) {
                            item = Object.assign(item, a);
                            item.linked = true;
                            break;
                        }
                    }
                }
                if (item.linked) {
                    ret.push(item);
                }
            } else {
                ret.push(item);
            }
        })
        return ret;
    }
};